Hadoop安装与配置(二)
1.1搭建zookeeper集群
(1)下载并解压zookeeper
到官网(地址:http://Zookeeper.apache.org/releases.html# download)下载Zookeeper稳定版本的apache-zookeeper-3.8.4-bin.tar.gz安装包,然后上传至hadoop1 节点的/home/hadoop/app目录下并解压,具体操作如下所示。
#解压Zookeeper
[hadoop@hadoop1 app]$ tar -zxvf apache-zookeeper-3.8.4-bin.tar.gz
#创建Zookeeper软连接
[hadoop@hadoop1 app]$ ln -s apache-zookeeper-3.8.4-bin zookeeper
(2)修改zoo.cfg配置文件
在运行 Zookeeper 服务之前,需要新建一个配置文件。这个配置文件习惯上命名为zoo.cfg,并保存在conf子目录中,其核心内容如下所示。
[hadoop@hadoop1 app]$ cd zookeeper
[hadoop@hadoop1 zookeeper]$ cd conf/
[hadoop@hadoop1 conf]$ ls
configuration.xsl logback.xml zoo_sample.cfg
[hadoop@hadoop1 conf]$ cp zoo_sample.cfg zoo.cfg
[hadoop@hadoop1 conf]$ vi zoo.cfg
#数据目录需要提前创建
dataDir=/home/hadoop/data/zookeeper/zkdata
#日志目录需要提前创建
dataLogDir=/home/hadoop/data/zookeeper/zkdatalog
#访问端口号
clientPort=2181
#server.每个节点服务编号=服务器ip地址:集群通信端口:选举端口
server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
server.3=hadoop3:2888:3888
具体操作步骤如图1-1所示。
图1-1 修改zoo.cfg配置文件
(3)同步zookeeper安装目录
使用scp命令将hadoop1节点的Zookeeper安装目录,整体同步到集群的hadoop2和hadoop3节点,具体操作如下所示。
方法1:使用远程拷贝命令scp,操作步骤如下。
[hadoop@hadoop1 app]$scp -r zookeeper-3.4.6 hadoop@hadoop2:/home/hadoop/app/
[hadoop@hadoop1 app]$scp -r zookeeper-3.4.6 hadoop@hadoop3:/home/hadoop/app/
方法2:使用集群脚本,操作步骤如下。
[hadoop@hadoop1 app]$ deploy.sh apache-zookeeper-3.8.4-bin /home/hadoop/app/ slave
然后分别在hadoop2和hadoop3节点上创建Zookeeper软连接,具体操作如下所示。
[hadoop@hadoop2 app]$ ln -s apache-zookeeper-3.8.4-bin zookeeper
[hadoop@hadoop3 app]$ ln -s apache-zookeeper-3.8.4-bin zookeeper
(4)创建数据和日志目录
在集群各个节点创建Zookeeper数据目录和日志目录,需要跟zoo.cfg配置文件保持一致,具体操作如下所示。
#创建Zookeeper数据目录
方法1:三个节点分别创建。
[hadoop@hadoop1 app]$mkdir -p /home/hadoop/data/zookeeper/zkdata
[hadoop@hadoop2 app]$mkdir -p /home/hadoop/data/zookeeper/zkdata
[hadoop@hadoop3 app]$mkdir -p /home/hadoop/data/zookeeper/zkdata
方法2:使用集群脚本。
[hadoop@hadoop1 ~]$ runRemoteCmd.sh 'mkdir -p /home/hadoop/data/zookeeper/zkdata' all
执行效果如图1-2所示。
图1-2 创建zkdata目录
#创建Zookeeper日志目录
方法1:
[hadoop@hadoop1 app] mkdir -p /home/hadoop/data/zookeeper/zkdatalog
[hadoop@hadoop2 app] mkdir -p /home/hadoop/data/zookeeper/zkdatalog
[hadoop@hadoop3 app] mkdir -p /home/hadoop/data/zookeeper/zkdatalog
方法2:(必须安装配置相应脚本工具)
[hadoop@hadoop1 ~]$ runRemoteCmd.sh 'mkdir -p /home/hadoop/data/zookeeper/zkdatalog' all
执行效果如图1-3所示。
图1-3 创建zkdatalog目录
(5)创建各节点服务编号
分别在Zookeeper集群各个节点,进入/home/hadoop/data/zookeeper/zkdata目录,创建文件myid,然后分别输入服务编号,具体操作如下所示:
#hadoop1节点
[hadoop@hadoop1 zkdata]$ touch myid
[hadoop@hadoop1 zkdata]$ echo 1 > myid
#hadoop2节点
[hadoop@hadoop2 zkdata]$ touch myid
[hadoop@hadoop2 zkdata]$ echo 2 > myid
#hadoop3节点
[hadoop@hadoop3 zkdata]$ touch myid
[hadoop@hadoop3 zkdata]$ echo 3 > myid
注意:每个节点服务编号的值是一个整形数字且不能重复。
(6)启动Zookeeper集群服务
1)在集群各个节点分别进入Zookeeper安装目录,然后使用如下命令启动Zookeeper服务。
方法1:
[hadoop@hadoop1 zookeeper]$ bin/zkServer.sh start
[hadoop@hadoop2 zookeeper]$ bin/zkServer.sh start
[hadoop@hadoop3 zookeeper]$ bin/zkServer.sh start
方法2:
[hadoop@hadoop1 ~]$ runRemoteCmd.sh '/home/hadoop/app/zookeeper/bin/zkServer.sh start' all
执行效果如图1-4所示。
图1-4 启动zookeeper集群
2)Zookeeper集群启动一会之后,通过如下命令查看Zookeeper集群状态。
方法1:
[hadoop@hadoop:1 zookeeper]$ bin/zkServer.sh status
[hadoop@hadoop2 zookeeper]$ bin/zkServer.sh status
[hadoop@hadoop3 zookeeper]$ bin/zkServer.sh status
方法2:
[hadoop@hadoop1 ~]$ runRemoteCmd.sh '/home/hadoop/app/zookeeper/bin/zkServer.sh status' all
执行效果如图1-5所示。
图1-5 查看zookeeper集群状态
如果在Zookeeper集群中,其中一个节点为leader领导者,另外两个节点是follower跟随者,说明Zookeeper集群安装部署成功。
1.2搭建完全分布式Hadoop集群
1.1.1 HDFS集训搭建
(1)下载解压Hadoop
首先到官网(地址:https://archive.apache.org/dist/hadoop/common/)下载Hadoop稳定版本的安装包,然后上传至hadoop1节点下的/home/hadoop/app目录下并解压,具体操作如下所示。
[hadoop@hadoop1 app]$ tar -zxvf hadoop-3.3.1.tar.gz //解压
[hadoop@hadoop1 app]$ ln -s hadoop-3.3.1 hadoop //创建软连接
[hadoop@hadoop1 app]$ cd /home/hadoop/app/hadoop/etc/hadoop/ //切换到配置目录
(2)修改HDFS配置文件
1)修改hadoop-env.sh配置文件。hadoop-env.sh文件主要配置跟hadoop环境相关的变量,这里主要修改JAVA_HOME的安装目录,具体操作如下所示。
[hadoop@hadoop1 hadoop]$ vi hadoop-env.sh
export JAVA_HOME=/home/hadoop/app/jdk
2)修改core-site.xml配置文件。core-site.xml文件主要配置hadoop的公有属性,具体需要配置的每个属性如下所示。
[hadoop@hadoop1 hadoop]$ vi core-site.xml
fs.defaultFS
hdfs://mycluster
hadoop.tmp.dir
/home/hadoop/data/tmp
ha.zookeeper.quorum
hadoop1:2181,hadoop2:2181,hadoop3:2181
3)修改hdfs-site.xml配置文件。hdfs-site.xml文件主要配置跟HDFS相关的属性,具体需要配置的每个属性如下所示。
[hadoop@hadoop1 hadoop]$ vi hdfs-site.xml
dfs.namenode.name.dir
file:/home/hadoop/data/dfs/name
dfs.datanode.data.dir
file:/home/hadoop/data/dfs/data
dfs.journalnode.edits.dir
/home/hadoop/data/journaldata/jn
dfs.nameservices
mycluster
dfs.ha.namenodes.mycluster
nn1,nn2,nn3
dfs.namenode.rpc-address.mycluster.nn1
hadoop1:8020
dfs.namenode.rpc-address.mycluster.nn2
hadoop2:8020
dfs.namenode.rpc-address.mycluster.nn3
hadoop3:8020
dfs.namenode.http-address.mycluster.nn1
hadoop1:9870
dfs.namenode.http-address.mycluster.nn2
hadoop2:9870
dfs.namenode.http-address.mycluster.nn3
hadoop3:9870
dfs.namenode.shared.edits.dir
qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/mycluster
dfs.client.failover.proxy.provider.mycluster org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
dfs.ha.fencing.methods
sshfence
dfs.ha.fencing.ssh.private-key-files
/home/hadoop/.ssh/id_rsa
dfs.ha.automatic-failover.enabled
true
dfs.permissions.enabled
false
4)配置workers文件。workers文件是根据集群规划配置DataNode节点所在的主机名,具体操作如下所示。
[hadoop@hadoop1 hadoop]$ vi workers
hadoop1
hadoop2
hadoop3
5)向所有节点远程复制Hadoop安装目录。在hadoop1节点,切换到/home/hadoop/app目录下,将Hadoop安装目录远程复制到hadoop2和hadoop3节点,具体操作如下两种方法:
方法1:
[hadoop@hadoop1 app]$scp -r hadoop-3.3.1 hadoop@hadoop2:/home/hadoop/app/
[hadoop@hadoop1 app]$scp -r hadoop-3.3.1 hadoop@hadoop3:/home/hadoop/app/
方法2:
[hadoop@hadoop1 hadoop]$ deploy.sh /home/hadoop/app/hadoop-3.3.1 /home/hadoop/app slave
然后在hadoop2和hadoop3节点上分别创建软连接,具体操作如下所示。
[hadoop@hadoop2 app]$ ln -s hadoop-3.3.1 hadoop
[hadoop@hadoop3 app]$ ln -s hadoop-3.3.1 hadoop
备注:复制前删除使用rm -rf hadoop hadoop-3.3.1命令hadoop1、hadoop2上的hadoop hadoop-3.3.1目录
1.1.2 启动HDFS集群服务
(1)启动Zookeeper集群
在集群所有节点分别启动Zookeeper服务,具体操作如下所示。
方法1:分别在三个节点启动。
[hadoop@hadoop1 zookeeper]$ bin/zkServer.sh start
[hadoop@hadoop2 zookeeper]$ bin/zkServer.sh start
[hadoop@hadoop3 zookeeper]$ bin/zkServer.sh start
方法2:使用远程执行脚本。
[hadoop@hadoop1 hadoop]$ runRemoteCmd.sh '/home/hadoop/app/zookeeper/bin/zkServer.sh start ' all
(2)启动Journalnode集群
在集群所有节点分别启动Journalnode服务,具体操作如下所示。
方法1:分别在三个节点启动。
[hadoop@hadoop1 hadoop]$sbin/hadoop-daemon.sh start journalnode
[hadoop@hadoop2 hadoop]$sbin/hadoop-daemon.sh start journalnode
[hadoop@hadoop3 hadoop]$sbin/hadoop-daemon.sh start journalnode
方法2:使用远程执行脚本。
[hadoop@hadoop1 hadoop]$ runRemoteCmd.sh '/home/hadoop/app/hadoop/sbin/hadoop-daemon.sh start journalnode' all
(3)格式化主节点NameNode
在hadoop1节点(NameNode主节点)上,使用如下命令对NameNode进行格式化。
[hadoop@hadoop1 hadoop]$ bin/hdfs namenode -format / /n amenode 格式化
[hadoop@hadoop1 hadoop]$ bin/hdfs zkfc -formatZK //格式化高可用
[hadoop@hadoop1 hadoop]$bin/hdfs namenode //启动namenode
(4)备用NameNode同步主节点元数据
在hadoop1节点启动NameNode服务的同时,需要在hadoop2,hadoop3节点(NameNode备用节点)上执行如下命令同步主节点的元数据。
[hadoop@hadoop2 hadoop]$ bin/hdfs namenode -bootstrapStandby
[hadoop@hadoop3 hadoop]$ bin/hdfs namenode -bootstrapStandby
(5)关闭Journalnode集群
hadoop2节点同步完主节点元数据之后,紧接着在hadoop1节点上,按下〈Ctrl+C〉组合键来结束NameNode进程,然后关闭所有节点上面的Journalnode进程,具体操作如下所示。
[hadoop@hadoop1 hadoop]$sbin/hadoop-daemon.sh stop journalnode
[hadoop@hadoop2 hadoop]$ sbin/hadoop-daemon.sh stop journalnode
[hadoop@hadoop3 hadoop]$ sbin/hadoop-daemon.sh stop journalnode
(6)一键启动HDFS集群
如果上面操作没有问题,在hadoop1节点上,可以使用脚本一键启动HDFS集群所有相关进程,具体操作下所示。
[hadoop@hadoop1 hadoop]$ sbin/start-dfs.sh
注意:第一次安装HDFS需要对NameNode进行格式化,HDFS集群安装成功之后,以后使用start-dfs.sh脚本一键启动HDFS集群的所有进程即可。
1.1.3 HDFS集群测试
在浏览器中分别输入网址http://hadoop1:9870,以及http://hadoop3:9870通过 Web 界面查看hadoop1、hadoop3节点的NameNode的状态,结果如图1-6所示。该节点的状态为standby,表示HDFS不能通过hadoop1节点的NameNode对外提供服务。
图1-6 standby状态的NameNode界面
在浏览器中输入网址http://hadoop2:9870,通过Web界面查看hadoop2节点的NameNode的状态,结果如图2-54所示。该节点的状态为active,表示hadoop2节点的NameNode可以对外提供服务。
图1-7 active状态的NameNode界面
注意:某一时刻只能有一个NameNode节点处于active状态。
在hadoop1节点的/home/hadoop/app/hadoop目录下创建words.log文件,然后上传至 HDFS文件系统的/test目录下,检查 HDFS是否能正常使用,具体操作如下:
#本地新建words.log文件
[hadoop@hadoop1 hadoop]$ vi words.log
hadoop hadoop hadoop
spark spark spark
flink flink flink
[hadoop@hadoop1 hadoop]$ hdfs dfs -mkdir /test
#上传本地文件words.log
[hadoop@hadoop1 hadoop]$ hdfs dfs -put words.log /test
#查看words.log是否上传成功
[hadoop@hadoop1 hadoop]$ hdfs dfs -ls /test
/test/words.log
如果上面操作没有异常,说明HDFS分布式集群搭建成功。
1.1.4 YARN集群配置
(1)修改 mapred-site.xml配置文件
mapred-site.xml 文件主要配置跟 MapReduce 相关的属性,这里主要将MapReduce的运行环境指定为YARN,核心配置如下所示。
[hadoop@hadoop1 hadoop]$ vi mapred-site.xml
mapreduce.framework.name
yarn
(2)修改 yarn-site.xml配置文件
yarn-site.xml 文件主要配置跟YARN 相关的属性,核心配置如下所示。
[hadoop@hadoop1 hadoop]$ vi yarn-site.xml
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.resourcemanager.ha.enabled
true
yarn.resourcemanager.cluster-id
cluster-yarn1
yarn.resourcemanager.ha.rm-ids
rm1,rm2,rm3
yarn.resourcemanager.hostname.rm1
hadoop1
yarn.resourcemanager.webapp.address.rm1
hadoop1:8088
yarn.resourcemanager.address.rm1
hadoop1:8032
yarn.resourcemanager.scheduler.address.rm1
hadoop1:8030
yarn.resourcemanager.resource-tracker.address.rm1
hadoop1:8031
yarn.resourcemanager.hostname.rm2
hadoop2
yarn.resourcemanager.webapp.address.rm2
hadoop2:8088
yarn.resourcemanager.address.rm2
hadoop2:8032
yarn.resourcemanager.scheduler.address.rm2
hadoop2:8030
yarn.resourcemanager.resource-tracker.address.rm2
hadoop2:8031
yarn.resourcemanager.hostname.rm3
hadoop3
yarn.resourcemanager.webapp.address.rm3
hadoop3:8088
yarn.resourcemanager.address.rm3
hadoop3:8032
yarn.resourcemanager.scheduler.address.rm3
hadoop3:8030
yarn.resourcemanager.resource-tracker.address.rm3
hadoop3:8031
yarn.resourcemanager.zk-address
hadoop1:2181,hadoop2:2181,hadoop3:2181
yarn.resourcemanager.recovery.enabled
true
yarn.resourcemanager.store.class
org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
yarn.nodemanager.env-whitelist
JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLAS
SPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME
(3)向所有节点同步YARN配置文件
在hadoop1节点上修改完YARN相关配置之后,将修改的配置文件远程复制到hadoop2节点和hadoop3节点,具体操作如下所示。
#将 mapred-site.xml文件远程复制到hadoop2和hadoop3节点
方法1:
[hadoop@hadoop1 hadoop]$scp -r mapred-site.xml hadoop@hadoop2:/home/hadoop/app/hadoop/etc/hadoop
[hadoop@hadoop1 hadoop]$scp -r mapred-site.xml hadoop@hadoop3:/home/hadoop/app/hadoop/etc/hadoop
方法2:
[hadoop@hadoop1 hadoop]$ deploy.sh mapred-site.xml /home/hadoop/app/hadoop/etc/hadoop/ slave
#将yarn-site.xml文件远程复制到hadoop2和hadoop3节点
方法1:
[hadoop@hadoop1 hadoop]$scp -r yarn-site.xml hadoop@hadoop2:/home/hadoop/app/hadoop/etc/hadoop
[hadoop@hadoop1 hadoop]$scp -r yarn-site.xml hadoop@hadoop3:/home/hadoop/app/hadoop/etc/hadoop
方法2:
[hadoop@hadoop1 hadoop]$ deploy.sh yarn-site.xml /home/hadoop/app/hadoop/etc/hadoop/ slave
1.1.5 启动YARN集群服务
YARN HA的实现依赖于Zookeeper,所以需要优先启动Zookeeper集群。因为前面操作已经启动Zookeeper集群,所以该步骤可以跳过。
启动YARN集群
在hadoop1节点上,使用脚本一键启动YARN集群,具体操作如下所示。
[hadoop@hadoop1 hadoop]$ sbin/start-yarn.sh
1.1.6 YARN集群测试
(1)Web界面查看YARN集群
在浏览器中输入网址http://hadoop1:8088(或者http://hadoop2:8088;http://hadoop3:8088),通过 Web 界面查看YARN集群信息,结果如图1-8所示。
图1-8 Web界面查看YARN集群
(2)YARN集群测试
为了测试YARN集群是否可以正常运行MapReduce程序,我们以Hadoop自带的wordcount示例来进行演示,具体操作如图1-9所示。
[hadoop@hadoop1 hadoop]$ bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount /test/words.log /test/out
图1-9 YARN集群运行wordcount
MapReduce作业在YARN集群执行状态结果,如图1-10所示。
图1-10 MapReduce作业运行状态
如果上述操作没有异常,最终作业的状态信息显示为SUCCEEDED,就说明MapReduce程序在YARN集群上面运行成功,从而说明Hadoop分布式集群已经全部搭建成功。
通过命令查询执行结果:
[hadoop@hadoop1 hadoop]$ bin/hdfs dfs -cat /test/out/*
执行结果如图1-11所示。
图1-11MapReduce作业运行结果
II